<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Programmation logique</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Programmation_logique"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Programmation_logique rootpage-Programmation_logique skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Programmation logique</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>La <b>programmation logique</b> est une forme de <a href="Programmation" class="mw-redirect" title="Programmation">programmation</a> qui définit les <a href="Application_(informatique)" title="Application (informatique)">applications</a> à l'aide :
</p>
<ul><li>d'une <a href="Base_de_faits" class="mw-redirect" title="Base de faits">base de faits</a> : ensemble de faits élémentaires concernant le domaine visé par l'application,</li>
<li>d'une base de règles : règles de <a href="Logique" title="Logique">logique</a> associant des conséquences plus ou moins directes à ces faits,</li>
<li>d'un <a href="Moteur_d'inf%C3%A9rence" title="Moteur d'inférence">moteur d'inférence</a> (ou démonstrateur de théorème ) : exploite ces faits et ces règles en réaction à une question ou requête.</li></ul>
<p>Cette approche se révèle beaucoup plus souple que la définition d'une succession d'instructions que l'<a href="Ordinateur" title="Ordinateur">ordinateur</a> exécuterait. La programmation logique est considérée comme une <a href="Programmation_d%C3%A9clarative" title="Programmation déclarative">programmation déclarative</a> plutôt qu’impérative, car elle s'attache davantage au <i>quoi</i> qu'au <i>comment</i>, le moteur assumant une large part des enchaînements. Elle est particulièrement adaptée aux besoins de l’<a href="Intelligence_artificielle" title="Intelligence artificielle">intelligence artificielle</a>, dont elle est un des principaux outils.
</p>
<div class="mw-heading mw-heading2"><h2 id="Vers_la_démonstration_automatique"><span id="Vers_la_d.C3.A9monstration_automatique"></span>Vers la démonstration automatique</h2></div>
<p>Dans les années 1930, <a href="Jacques_Herbrand" title="Jacques Herbrand">Herbrand</a> avait posé les conditions de validité d'une démonstration automatique. En 1953, <a href="Willard_van_Orman_Quine" class="mw-redirect" title="Willard van Orman Quine">Quine</a> donnait une <a href="R%C3%A8gle_d'inf%C3%A9rence" title="Règle d'inférence">règle d'inférence</a> originale ; définie pour l'ordre 0, elle présentait peu d'intérêt si ce n'est pour améliorer le calcul des circuits logiques. En 1965, <a href="John_Alan_Robinson" title="John Alan Robinson">John Alan Robinson</a> donnait sa <a href="R%C3%A8gle_de_r%C3%A9solution" title="Règle de résolution">méthode de Résolution</a> : il basait une démonstration automatique sur les conditions d'Herbrand, avec un <a href="Raisonnement_par_l'absurde" title="Raisonnement par l'absurde">raisonnement par l'absurde</a> utilisant des énoncés logiques mis sous forme clausale, et une Règle de Résolution, extension à l'ordre 1 de la règle de Quine.
Les premiers essais montrèrent que l'idée y était, mais qu'il restait à en trouver une expression efficace : ce sera <a href="Prolog" title="Prolog">Prolog</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Approche_informatique">Approche informatique</h2></div>
<p>En 1958, <a href="John_McCarthy" title="John McCarthy">John McCarthy</a> proposait déjà d’utiliser la logique comme langage déclaratif de <a href="Repr%C3%A9sentation_des_connaissances" title="Représentation des connaissances">représentation des connaissances</a>, un démonstrateur de théorème devenant un solveur de problème. La résolution de problèmes est alors répartie entre le cogniticien, responsable de la validité de l’application exprimée logiquement, et le moteur d’inférence, responsable d’une exécution valide et efficace.
</p><p>En un sens plus étroit et plus commun, la programmation logique joue sur une ambivalence représentation déclarative/représentation procédurale : ainsi, un raisonnement régressif associera à l’implication
<i>B1&…&Bn → H</i>
une procédure « pour établir H, établir B1 puis… puis Bn ». De ce fait, au nom de l’efficacité, le programmeur peut être amené à exploiter les propriétés physiques du démonstrateur, se rapprochant ainsi d’une programmation classique.
Cependant, les programmes logiques gardent toujours une interprétation logique pure permettant de garantir leur correction, et, du fait de leur caractère déclaratif, sont plus abstraits que leur contrepartie impérative, tout en restant exécutables.
</p><p>Les premières applications de la programmation logique (1964-69) concernèrent des systèmes de questions/réponses. <b>Absys</b> (1969) fut probablement le premier langage de programmation à base d’assertions.
</p><p>La programmation logique au sens étroit remonte aux débats de cette époque concernant la représentation des connaissances en <a href="Intelligence_artificielle" title="Intelligence artificielle">intelligence artificielle</a>. <a href="Universit%C3%A9_Stanford" title="Université Stanford">Stanford</a> et <a href="Universit%C3%A9_d'%C3%89dimbourg" title="Université d'Édimbourg">Édimbourg</a>, avec <a href="John_McCarthy" title="John McCarthy">J. McCarthy</a> et Kowalski, tenaient pour une représentation déclarative, et le <a href="Massachusetts_Institute_of_Technology" title="Massachusetts Institute of Technology">MIT</a>, avec <a href="Marvin_Minsky" title="Marvin Minsky">Marvin Minsky</a> et <a href="Seymour_Papert" title="Seymour Papert">Seymour Papert</a>, pour une représentation procédurale.
</p><p>Planner (Hewitt 1969), langage fondé sur la logique, émergea cependant au MIT. Son sous-ensemble Micro-Planner (Sussman, Charniak, <a href="Shmuel_Winograd" title="Shmuel Winograd">Winograd</a>) fut utilisé par Winograd pour <a href="SHRDLU" title="SHRDLU">SHRDLU</a>, programme fondé sur l’interprétation d’un dialogue en <a href="Langage_naturel" title="Langage naturel">langage naturel</a>. Planner invoquait des plans procéduraux à partir de buts et d’assertions, et utilisait des reprises en arrière pour ménager le peu de mémoire disponible. Dérivèrent de Planner QA-4, Popler, Conniver, QLISP, Ether.
</p><p>Cependant, Hayes et Kowalski à Édimbourg essayaient de réconcilier approche déclarative et représentation des connaissances avec l’approche procédurale à la Planner. Hayes (1973) développa un langage équationnel, Golux, qui pouvait invoquer diverses procédures en altérant le fonctionnement du moteur d’inférence. Kowalski montrait par ailleurs que la SL-resolution traitait les implications comme procédures réductrices des buts.
</p>
<div class="mw-heading mw-heading2"><h2 id="L'avènement_de_Prolog"><span id="L.27av.C3.A8nement_de_Prolog"></span>L'avènement de Prolog</h2></div>
<p><a href="Alain_Colmerauer" title="Alain Colmerauer">Alain Colmerauer</a>, universitaire français passé de la compilation à la <a href="Traduction_automatique" title="Traduction automatique">traduction automatique</a> (<a href="Montr%C3%A9al" title="Montréal">Montréal</a>, 1967-70), eut d'abord l’idée des systèmes-Q (1969), formés de règles de réécriture d’<a href="Arbre_(informatique)" class="mw-redirect" title="Arbre (informatique)">arbres</a>, invoquées selon les besoins et utilisant l’unification. Ces systèmes furent à la base d’une chaîne de traduction anglais→français, puis de la rédaction du système Météo qui, au <a href="Canada" title="Canada">Canada</a>, traduit chaque jour les bulletins <a href="M%C3%A9t%C3%A9orologie" title="Météorologie">météorologiques</a> de l’anglais au français.
</p><p>Après 1970, Colmerauer revenu à <a href="Marseille" title="Marseille">Marseille</a> s’intéressa davantage à l’exploitation de textes qu’à leur traduction ; voulant utiliser la logique pour représenter la sémantique aussi bien que pour les raisonnements liés aux questions, il s’intéressa aux travaux de Robinson sur le principe de résolution.
</p><p>Durant l’été 1971, Colmerauer et Kowalski comprirent que les formes propositionnelles pouvaient représenter des <a href="Grammaire_formelle" title="Grammaire formelle">grammaires formelles</a> et qu’un moteur d’inférence pouvait être utilisé pour l’analyse de textes, certains moteurs fournissant une analyse ascendante, et la résolution-SL de Kowalski une analyse descendante. L’été suivant, ils développèrent l’interprétation procédurale des implications, et établirent qu’on peut restreindre les clauses aux clauses de Horn, correspondant à des implications où antécédents et conséquent sont des énoncés atomiques.
</p><p>A. Colmerauer et <a href="Philippe_Roussel" title="Philippe Roussel">P. Roussel</a> développèrent alors le langage <b><a href="Prolog" title="Prolog">Prolog</a></b> comme outil permettant de décrire un monde en <a href="Fran%C3%A7ais" title="Français">français</a>, et permettant ensuite de répondre à des questions sur ce monde, Prolog servant aussi bien à l’analyse qu'à la synthèse en français et aux raisonnements permettant d'élaborer les réponses. Ce premier Prolog se diffusa rapidement. L’intérêt de Prolog pour l’interrogation en langue naturelle de bases de données déboucha sur un configurateur pour ordinateurs Solar (Télémécanique), dont dériveront divers systèmes d’interrogation en français, en <a href="Anglais" title="Anglais">anglais</a> (Warren), en <a href="Portugais" title="Portugais">portugais</a> (Pereira, Lisbonne), puis en <a href="Allemand" title="Allemand">allemand</a>.
</p><p>D'autres applications naquirent parallèlement : composition d'un repas <a href="Di%C3%A9t%C3%A9tique" title="Diététique">diététique</a>, <a href="Calcul_symbolique" class="mw-redirect" title="Calcul symbolique">calcul symbolique</a>, organisation d'un <a href="Compagnie_a%C3%A9rienne" title="Compagnie aérienne">voyage aérien</a>…
</p><p>1976 vit un premier portage de Prolog sur micro-ordinateur.
</p><p>En 1977, D. Warren développa à <a href="%C3%89dimbourg" title="Édimbourg">Édimbourg</a> un compilateur Prolog, qui apporta à Prolog la performance qui lui manquait. Le Prolog d’Édimbourg, avec sa syntaxe particulière, devint ainsi un standard.
</p>
<div class="mw-heading mw-heading2"><h2 id="Développements"><span id="D.C3.A9veloppements"></span>Développements</h2></div>
<p>En 1982 sortit Prolog II, qui utilisait des systèmes d’<a href="%C3%89quation" title="Équation">équations</a> plutôt que l’unification, et, surtout, permettait le traitement des <a href="Arbre_(math%C3%A9matiques)" title="Arbre (mathématiques)">arbres infinis</a>.
</p><p>À partir de 1987, Prolog III intégrait au niveau de l’unification : une représentation des arbres <i>rationnels</i> (éventuellement infinis), avec un traitement spécifique pour les <a href="Liste_(informatique)" title="Liste (informatique)">listes</a> ; un traitement complet de l’<a href="Alg%C3%A8bre_de_Boole_(logique)" title="Algèbre de Boole (logique)">algèbre de Boole</a> ; un traitement numérique portant sur l’addition, la multiplication par une constante et les relations usuelles.
</p><p>En 1996, Prolog IV s’attaqua résolument au traitement des contraintes. <a href="Programmation_par_contraintes" title="Programmation par contraintes">Programmer par contraintes</a> consiste à formuler un problème en termes d’inconnues soumises à une contrainte, énoncé du premier ordre faisant intervenir des opérations et des relations du domaine de calcul. Résoudre la contrainte, et par là le problème, consiste à trouver les valeurs à attribuer aux variables libres de la formule pour la rendre vraie, ce qui unifie la programmation logique et la programmation mathématique (au sens de la <a href="Recherche_op%C3%A9rationnelle" title="Recherche opérationnelle">recherche opérationnelle</a>). Au prix d’un moteur dix fois plus gros que pour Prolog II, Prolog IV traite un vaste jeu de contraintes, allant des contraintes sur les listes et les arbres aux contraintes numériques, en passant par les contraintes traitées par réduction des intervalles de valeur, s’appliquant aussi bien aux réels qu’aux entiers voire aux booléens.
</p>
<div class="mw-heading mw-heading2"><h2 id="Descendance">Descendance</h2></div>
<p>À partir de Prolog, furent développés par exemple Gödel, <a href="Oz_(langage)" title="Oz (langage)">Oz</a>, <a href="Mercury_(langage)" title="Mercury (langage)">Mercury</a>, <a href="Erlang_(langage)" title="Erlang (langage)">Erlang</a> ou Visual Prolog.
λProlog abordait les logiques d'ordre supérieur. Outre <a href="Datalog" title="Datalog">datalog</a> et divers langages de programmation logique sous contraintes, le projet japonais d'<a href="L5G" class="mw-redirect" title="L5G">ordinateurs de <abbr class="abbr" title="Cinquième">5<sup>e</sup></abbr> génération</a> fut à l'origine de nombreux langages de programmation logique concurrente, tels que plus récemment CS Prolog ou Actor Prolog.
</p>
<div class="mw-heading mw-heading2"><h2 id="Langages_de_programmation_logique">Langages de programmation logique</h2></div>
<ul><li><a href="Prolog" title="Prolog">Prolog</a> : Le premier langage de programmation logique ;</li>
<li><a href="Oz_(langage)" title="Oz (langage)">Oz</a> ;</li>
<li><a href="Clips_(langage)" title="Clips (langage)">CLIPS</a> ;</li>
<li><a href="Python_(langage)" title="Python (langage)">Python</a> : <span class="need_ref" title="Ce passage nécessite une référence." style="cursor:help;"><a href="PyPy" title="PyPy">PyPy</a> permet de l'utiliser pour la programmation logique.</span><sup class="need_ref_tag" style="padding-left:2px;">[réf. nécessaire]</sup></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Bibliographie">Bibliographie</h2></div>
<ul><li><span class="ouvrage" id="Baral_et_M._Gelfond1994"><span class="ouvrage" id="C._Baral_et_M._Gelfond1994">C. Baral et M. Gelfond, « <cite style="font-style:normal">Logic programming and knowledge representation</cite> », <i>The Journal of Logic Programming</i>, <abbr class="abbr" title="volume">vol.</abbr> 19–20, <time>1994</time>, <abbr class="abbr" title="pages">p.</abbr> <span class="nowrap">73–148</span> <small style="line-height:1em;">(<a href="Digital_Object_Identifier" title="Digital Object Identifier">DOI</a> <span class=" noarchive nowrap"><a rel="nofollow" class="external text" href="https://dx.doi.org/10.1016/0743-1066%2894%2990025-6">10.1016/0743-1066(94)90025-6</a></span>, <a rel="nofollow" class="external text" href="http://redwood.cs.ttu.edu/~mgelfond/PAPERS/survey.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=Logic+programming+and+knowledge+representation&rft.jtitle=The+Journal+of+Logic+Programming&rft.au=C.+Baral+et+M.+Gelfond&rft.date=1994&rft.volume=19%E2%80%9320&rft.pages=73%E2%80%93148&rft_id=info%3Adoi%2F10.1016%2F0743-1066%2894%2990025-6&rft_id=http%3A%2F%2Fredwood.cs.ttu.edu%2F~mgelfond%2FPAPERS%2Fsurvey.pdf&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+logique"></span></span></span></li>
<li><span class="ouvrage" id="Kowalski1988"><span class="ouvrage" id="R._A._Kowalski1988">R. A. Kowalski, « <cite style="font-style:normal">The early years of logic programming</cite> », <i>Communications of the ACM</i>, <abbr class="abbr" title="volume">vol.</abbr> 31, <time>1988</time>, <abbr class="abbr" title="pages">p.</abbr> <span class="nowrap">38–43</span> <small style="line-height:1em;">(<a href="Digital_Object_Identifier" title="Digital Object Identifier">DOI</a> <span class=" noarchive nowrap"><a rel="nofollow" class="external text" href="https://dx.doi.org/10.1145/35043.35046">10.1145/35043.35046</a></span>, <a href="Semantic_Scholar" title="Semantic Scholar">S2CID</a> <span class=" noarchive nowrap"><a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:12259230">12259230</a></span>, <a rel="nofollow" class="external text" href="http://www.doc.ic.ac.uk/~rak/papers/the%20early%20years.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=The+early+years+of+logic+programming&rft.jtitle=Communications+of+the+ACM&rft.aulast=Kowalski&rft.aufirst=R.+A.&rft.date=1988&rft.volume=31&rft.pages=38%E2%80%9343&rft_id=info%3Adoi%2F10.1145%2F35043.35046&rft_id=http%3A%2F%2Fwww.doc.ic.ac.uk%2F~rak%2Fpapers%2Fthe%2520early%2520years.pdf&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+logique"></span></span></span></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Liens_externes">Liens externes</h2></div>
<p class="mw-empty-elt">
</p>
<ul><li class="mw-empty-elt"></li>
<li class="mw-empty-elt"></li>
<li class="mw-empty-elt"></li>
<li><div class="liste-horizontale"><span class="wd_identifiers"><a href="Autorit%C3%A9_(sciences_de_l'information)" title="Autorité (sciences de l'information)">Notices d'autorité</a></span> : <ul><li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="https://catalogue.bnf.fr/ark:/12148/cb12067891q">BnF</a></span> (<span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="https://data.bnf.fr/ark:/12148/cb12067891q">données</a></span>)</li> <li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="http://id.loc.gov/authorities/sh86003454">LCCN</a></span></li> <li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="http://d-nb.info/gnd/4195096-3">GND</a></span></li> <li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="https://datos.bne.es/resource/XX550687">Espagne</a></span></li> <li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="https://www.nli.org.il/en/authorities/987007553495005171">Israël</a></span></li> <li><span class="nowrap uid noarchive"><a rel="nofollow" class="external text" href="https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=ph122430">Tchéquie</a></span></li> </ul></div></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<ul><li><a href="Programmation_logique_inductive" title="Programmation logique inductive">Programmation logique inductive</a></li>
<li><a href="Programmation_par_contraintes" title="Programmation par contraintes">Programmation par contraintes</a></li></ul>
<div class="navbox-container" style="clear:both;">
</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-09-15" href="https://fr.wikipedia.org/wiki/?title=Programmation_logique&oldid=228995661">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>